따릉이 데이터를 이용한 간단한 지도 그리기

library(rgdal)
library(rgeos)
library(tmap)
library(leaflet)
library(sp)
library(data.table)
library(tidyverse)

데이터 불러오기

서울시 공공 자전거 대여소 정보는 https://data.seoul.go.kr/dataList/OA-13252/F/1/datasetView.do 에서 다운로드가 가능하다. 참고 : stn 데이터는 링크에 있는 데이터와 다른 데이터지만 정비소 좌표만 이용하기 때문에 코드의 내용은 같다.

따릉이 정비소 데이터 불러오기

stn <- fread('C:\\Users\\uos\\Desktop\\Master\\bike sharing\\stn_info.csv', encoding = 'UTF-8')

stn <- stn %>% filter(!STATION_LONGITUDE == 0) # 좌표가 0인 정거장 제외 
stn <- stn %>% filter(!STATION_GRP_NAME == '정비센터') # 정비센터 9개 정거장 제외 
stn <- stn[, c(1, 12, 8, 9)]
stn
##       STATION_ID 거치대개수 STATION_LATITUDE STATION_LONGITUDE
##    1:      ST-10         10         37.55275          126.9186
##    2:     ST-100         15         37.53667          127.0736
##    3:    ST-1000         10         37.51038          126.8668
##    4:    ST-1002         10         37.52990          126.8765
##    5:    ST-1003         10         37.53955          126.8283
##   ---                                                         
## 1652:     ST-993         10         37.52143          126.8574
## 1653:     ST-994         15         37.52916          126.8727
## 1654:     ST-995         15         37.51068          126.8574
## 1655:     ST-996         15         37.52433          126.8505
## 1656:     ST-997         15         37.53439          126.8696

서울특별시 시군구 데이터 불러오기

대한민구 행정구역 관련된 데이터는 http://www.gisdeveloper.co.kr/?p=2332 에서 다운로드가 가능하다.

areas <- readOGR('C:\\Users\\uos\\Desktop\\Master\\Spatial Data Analysis\\서울시군구\\TL_SCCO_SIG_W.shp', encoding = 'utf-8')
## OGR data source with driver: ESRI Shapefile 
## Source: "C:\Users\uos\Desktop\MASTER\Spatial Data Analysis\서울시군구\TL_SCCO_SIG_W.shp", layer: "TL_SCCO_SIG_W"
## with 25 features
## It has 6 fields
## Integer64 fields read as strings:  ESRI_PK
coordinates(areas)
##        [,1]     [,2]
## 0  127.0324 37.66907
## 1  126.9270 37.61922
## 2  127.0549 37.58196
## 3  126.9517 37.49888
## 4  126.9008 37.46058
## 5  126.8563 37.49441
## 6  126.9773 37.59492
## 7  127.0112 37.64346
## 8  127.0929 37.59781
## 9  127.0630 37.49665
## 10 126.8228 37.56124
## 11 126.9960 37.56015
## 12 127.1470 37.55047
## 13 127.0858 37.54671
## 14 126.9081 37.55942
## 15 126.9454 37.46738
## 16 127.0312 37.47330
## 17 127.0176 37.60570
## 18 127.0751 37.65257
## 19 127.1154 37.50564
## 20 127.0411 37.55103
## 21 126.9391 37.57770
## 22 126.8555 37.52480
## 23 126.9103 37.52240
## 24 126.9799 37.53139
plot(areas)

R에서 shp 파일을 불러오기 위해서는 rgdal 패키지에 있는 readOGR 함수를 이용해야한다. shp 파일은 polygon 형태로 저장되어 있는 데이터인데 데이터 프레임 형태처럼 직관적이지 않기 때문에 다루기가 까다롭다. R에서는 shp 파일을 다루기 위해서 대표적으로 sp, sf 패키지가 있다. sf 패키지는 tidyvese와 연동이 잘되고 shp 파일을 데이터 프레임 형태로 직관적으로 볼 수 있다는 장점이 있다. 좌표변환이 sp 패키지보다 까다롭다. sp 패키지는 좌표 변환이 상대적으로 쉽고, tmap 패키지를 이용하면 ggplot만큼 쉽게 시각화가 가능하다.

coordinates 함수를 이용해서 좌표를 볼 수 있다.

좌표 변환

좌표계 관련된 자세한 설명은 이 블로그의 글을 참고하면 된다.
https://statkclee.github.io/spatial/geo-spatial-r.html

어떤 위치를 정의할 때 지도 api별로 다른 좌표계를 사용한다. 따라서 자료를 병합할 때에는 좌표계를 똑같이 맞춰야한다. 서울시 행정지도의 좌표계를 보면 CRS arguments: +proj=longlat +datum=WGS84 +no_defs 이므로 따릉이 데이터의 좌표계를 EPSG:4326로 설정해주었다.
지도 시각화를 위해서는 sp패키지를 이용해서 csv 파일을 SpatialPointsDataFrame으로 바꿔주여야한다. SpatialPointsDataFrame(data[경도, 위도], data, 좌표계)이다. %>% head() : 최소, 최대 위경도를 알 수 있다. %>% head() : 좌표값이 서울시 행정지도의 좌표값이 유사하게 바뀌었음을 알 수 있다.

stn.points <- SpatialPointsDataFrame(stn[,c(4,3)], stn, proj4string = CRS("+init=EPSG:4326"))
areas@proj4string
## CRS arguments: +proj=longlat +datum=WGS84 +no_defs
areas@bbox %>% head()
##         min      max
## x 126.76451 127.1838
## y  37.42831  37.7013
stn.points@coords %>% head()
##      STATION_LONGITUDE STATION_LATITUDE
## [1,]          126.9186         37.55275
## [2,]          127.0736         37.53667
## [3,]          126.8668         37.51038
## [4,]          126.8765         37.52990
## [5,]          126.8283         37.53955
## [6,]          126.8310         37.51410

시각화

시각화는 shp 파일의 좌표계 변환만 잘해주면 tmap 패키지를 이용해서 간단하게 구현이 가능하다.

변수의 범주를 어떻게 나눌지를 정하는 것이 시각화할 때 중요하다. 옵션은 다음과 같다.

tm_shape(areas) + tm_borders(alpha = 0.5)+
  tm_shape(stn.points)+tm_dots(col = '거치대개수', palette = "Reds", style = "quantile", scale = 2.5) + 
  tm_compass()+
  tm_layout(legend.text.size = 0.8, legend.title.size = 1.1, frame = FALSE)
## Compass not supported in view mode.
## Warning in sp::proj4string(obj): CRS object has comment, which is lost in output

interactive map

tmap 패키지는 leaflet 패키지를 이용해서 간단하게 interactive한 map을 만들 수 있다.

library(leaflet)
tmap_mode("view")
## tmap mode set to interactive viewing
tm_shape(areas) + tm_borders(alpha = 0.5)+
  tm_shape(stn.points)+tm_dots(col = '거치대개수', palette = "Reds", style = "quantile", scale = 2.5) + 
  tm_compass()+
  tm_layout(legend.text.size = 0.8, legend.title.size = 1.1, frame = FALSE)
## Compass not supported in view mode.
## Warning in sp::proj4string(obj): CRS object has comment, which is lost in output

참고 : chrome-extension://ohfgljdgelakfkefopgklcohadegdpjf/https://spatialanalysisonline.com/An%20Introduction%20to%20Spatial%20Data%20Analysis%20in%20R.pdf